import { Queue } from "../Collections/Queue";
import { PoolManager } from "../Manager/PoolManager";
import { App } from "./App";


/**
 * 预加载系统，当有新的预加载任务内容被加载之后则开始执行,
 * 该系统和POOLManager有耦合，其实是基于POOLManager
 * 开发一套上层预加载逻辑，所以判定资源是否预加载成功在于判定
 * PoolManager是否能取得对应资源。
 */
export class PreLoadSystem
{
    
    private _queue:Queue<string> = new Queue<string>();

    private isPreloadOk:boolean = false;
    
    private _preloadOkCall:()=>void;
    


    /**
     * 预加载接口
     * @param preloadCfg 
     * @param loadOk 
     */
    public Load(preloadCfg: string[], loadOk: () => void)
    {
        preloadCfg.forEach(element => {
            this._queue.Enquque(element);
            App.Instance.poolMgr.Load(element,()=>{});
        });
        
        this._preloadOkCall = loadOk;
    }

    upate(deltaTime: number)
    {
        if (this._queue.Count==0)
        {
            let call  = this._preloadOkCall; //写个临时变量是防止执行回调的时候时候报错,函数不断重入
            this._preloadOkCall = null; //所以提前设置为NULL
           call?.();          
            return;
        }

        var srcPoolName = this._queue.Peek();
        if (App.Instance.poolMgr.HasPool(srcPoolName))
        {
            this._queue.Dequeue();
        }
   
    }


}